<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category LIBRARY
   * @package LIBRARY/CORE.
   * @since 17/03/2012.
   * @last_update 17/03/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Core_Commons{
    /**
     * Método getView - Instancia a classe Zend_View.
     * 
     * @return object.
     */
    public static function getView(){
      $view = new Zend_View();
      
      return $view;
    }
    
    /**
     * Mostrar os dados de um array de modo formatado.
     * 
     * @param array $arrData
     * 
     * @return array | boolean
     */
    public static function debugging($arrData){
    	if(!$arrData)
    	  return false;
    	  
    	echo'<pre>';
    	print_r($arrData);
    	echo'</pre>';
    }
    
    /**
     * Se existir valores no objeto, carrega, caso contrário, retorna false.
     * 
     * @param object $objResult
     * 
     * @return database result | boolean
     */
    public static function onLoad($objResult){
      if($objResult)
        return $objResult;
      else
        return false;
    }
    
    /**
     * Método basePath - Diretório base do sistema.
     * 
     * @return string.
     */
    public static function basePath(){
      // Diretório do arquivo corrente.
      $real_path = realpath(dirname(__FILE__));
      
      // Caminho abaixo do diretório library.
      $path_self = substr($real_path, 0, strpos($real_path, 'library'));
    
      // Caminho absoluto.
      $path = $path_self;

      return $path;
    }
    
    /**
     * Método saveLog - Cria um arquivo de log.
     * 
     * @param string $msg - Mensagem a ser gravada no arquivo de log
     * 
     * @param string $logName - Nome do arquivo de log.
     * 
     * @return void
     */
    public static function saveLog($msg, $logName = null){
      // String da data atual sem separadores.
      $dt = self::setDateFormat("Ymd");
      
      //$path = self::basePath();
      $path = Zend_Registry::getInstance()->config->log->path;

      // Nome do arquivo de log.
      if($logName == null){
        $logName = Zend_Registry::getInstance()->config->log->name;
      }
      
      // Monta o caminho para o arquivo de log.
      $path_archive = $path . $logName . $dt. '.log';

      // Abre um arquivo especificado.
      $open_file = fopen($path_archive, 'a');

      // Concatena a data atual com a mensagem.
      $string = self::setDateFormat("d/m/Y H:i:s") . " ==> " . $msg;

      // Escreve o conteúdo da $string no arquivo apontado por $open_file .
      fwrite($open_file, $string);

      // Fecha o arquivo.
      fclose($open_file);
      
    }
    
    /**
     * Método readConfig - Le um arquivo de configuração e monta um array dos dados.
     * 
     * @param string $path -  Caminho do arquivo de configuração.
     * 
     * @return array.
     */
    public static function readConfig($path){
      $archive = explode("/", $path);
      
      if(file_exists($path)){
        if(!empty($path)){
          $file = parse_ini_file($path);

          return $file;
        }
        else{
          $msg_err = 'ERR - 001 - CONFIGARCHIVE - ARQUIVO "';
          $msg_err .= $archive[3] . '"'; 
          $msg_err .= 'ESTÃ VAZIO.';
          
          self::saveLog($msg_err);
        }
      }
      else{
        $msg_err = "ERR - 002 - CONFIGARCHIVE - ARQUIVO \"" . $archive[3] . "\" NÃƒO ENCONTRADO.";
        
        self::saveLog($msg_err);
      }
    }
    
    /**
     * Método setDateFormat - Formato da data atual.
     * 
     * @param string $format - formato da data.
     */
    public static function setDateFormat($format = ''){
      if($format != ''){
        // Armazena a data atual formatada conforme o desejado.
        $date = date($format);
      }
      else{
        // Armazena a data atual no formato 1999-12-31 00:59:59
        $date = date("Y-m-d H:i:s");
      }

      return $date;
    }
    
    /**
     * Método translate - Traduz o texto conforme a referencia do arquivo.
     * 
     * @param unknown_type $string
     */
    public static function translate($string){
      $msg_err = "";
      
      //$config = self::readConfig();
      
      //$lang = $config->language;
      
      $basePath = self::basePath();
        
      if(empty($basePath)){
        $msg_err = "ERR - 001 - TRANSLATE - O CAMINHO DESTE ARQUIVO ARQUIVO NÃƒO PODE SER VAZIO";  
      }
      else{
        $pathLang = $basePath . 'languages/' . $archiveName . '.lang';
        
        $archive = self::configArchive($pathLang);
        
        $archive = (object)$archive;
        
        $text = $archive->$string;
        
        if($text == ""){
          $text = $string;
        }
        
        return $text;
      }
    }
    
    /**
     * Método getCheck - Devolve X para true.
     * 
     * @param integer $data.
     * 
     * @return char.
     */
    public static function getCheck($data){
      if($data == 1){
        return 'X';
      }
      else{
        return;
      }
    }
    
    /**
     * Método validaCPF - Validar o CPF.
     * 
     * @param string $cpf
     */
    public static function validaCPF($cpf) {
      $nulos = array("12345678909",
                     "11111111111",
                     "22222222222",
                     "33333333333",
                     "44444444444",
                     "55555555555",
                     "66666666666",
                     "77777777777",
                     "88888888888",
                     "99999999999",
                     "00000000000");
      
      /* Retira todos os caracteres que nao sejam 0-9 */
      $cpf = ereg_replace("[^0-9]", "", $cpf);
      
      /*Retorna falso se houver letras no cpf */
      if(!(ereg("[0-9]",$cpf)))
        return false;
        
      /* Retorna falso se o cpf for nulo */
      if(in_array($cpf, $nulos))
        return false;
        
      /*Calcula o penúltimo dígito verificador*/
      $acum = 0;
      
      for($i = 0; $i < 9; $i++) {
        $acum += $cpf[$i]*(10-$i);
      }
      
      $x = $acum % 11;
      
      $acum = ($x > 1) ? (11 - $x) : 0;
     
      /* Retorna falso se o digito calculado eh diferente do passado na string */
      if($acum != $cpf[9]){
        return false;
      }
      
      /*Calcula o último dígito verificador*/
      $acum = 0;
      
      for($i = 0; $i < 10; $i++){
        $acum+= $cpf[$i]*(11-$i);
      }
        
      $x = $acum % 11;
      $acum = ($x > 1) ? (11 - $x) : 0;
      
      /* Retorna falso se o digito calculado eh diferente do passado na string */
      if($acum != $cpf[10]){
        return false;
      }
      
      /* Retorna verdadeiro se o cpf eh valido */
      return true;
    }
    
    /**
     * Método validaCNPJ - Valida o CNPJ.
     * 
     * @param string $cnpj
     */
    public static function validaCNPJ($cnpj) {
      if (strlen($cnpj) <> 18) return false;
      
      $soma1 = ($cnpj[0] * 5) + ($cnpj[1] * 4) + ($cnpj[3] * 3) + ($cnpj[4] * 2) + ($cnpj[5] * 9) + ($cnpj[7] * 8) + ($cnpj[8] * 7) + ($cnpj[9] * 6) + ($cnpj[11] * 5) + ($cnpj[12] * 4) + ($cnpj[13] * 3) + ($cnpj[14] * 2);
      
      $resto = $soma1 % 11;
      
      $digito1 = $resto < 2 ? 0 : 11 - $resto;
      
      $soma2 = ($cnpj[0] * 6) + ($cnpj[1] * 5) + ($cnpj[3] * 4) + ($cnpj[4] * 3) + ($cnpj[5] * 2) + ($cnpj[7] * 9) + ($cnpj[8] * 8) + ($cnpj[9] * 7) + ($cnpj[11] * 6) + ($cnpj[12] * 5) + ($cnpj[13] * 4) + ($cnpj[14] * 3) + ($cnpj[16] * 2);
      
      $resto = $soma2 % 11;
      
      $digito2 = $resto < 2 ? 0 : 11 - $resto;
      
      return (($cnpj[16] == $digito1) && ($cnpj[17] == $digito2));
    }
    
    /**
     * Método replace_special_char - Substritui os caracteres especiais da string por um caractere semelhante, ou sem o acento.
     * 
     * @param $string - strimg a ser substituida.
     * 
     * @return $string.
     */
    public static function replace_special_char($string){
      $chars = ereg_replace( "(([á]))",  "a", $string);
      
      $chars = ereg_replace( "(([êéè]))",  "e", $string);
      
      $chars = ereg_replace( "(([íìî]))",  "i", $string);
      
      $chars = ereg_replace( "(([óòõô]))",  "o", $string);
      
      $chars = ereg_replace( "(([ùúû]))",  "u", $string);
      
      $chars = ereg_replace( "(([ÃÁÀÂ]))",  "A", $string);
      
      $chars = ereg_replace( "(([ÊÉÈ]))",  "E", $string);
      
      $chars = ereg_replace( "(([ÍÌÎ]))",  "I", $string);
      
      $chars = ereg_replace( "(([ÓÒÕÔ]))",  "O", $string);
      
      $chars = ereg_replace( "(([ÙÚÛ]))",  "U", $string);
      
      $chars = ereg_replace( "(([º]))",  "o", $string);
      
      $chars = ereg_replace( "(([ª]))",  "a", $string);
      
      $chars = ereg_replace( "(([ç]))",  "c", $string);
      
      $chars = ereg_replace( "(([Ç]))",  "C", $string);
      
      $chars = ereg_replace( "(([&]))",  "e", $string);
      
      $chars = ereg_replace( "(([$]))",  "S", $string);
      
      $chars = ereg_replace( "(([%]))",  "0/0", $string);
      
      $chars = ereg_replace( "(([*]))",  "x", $string);
      
      $chars = ereg_replace( "(([¨]))",  "..", $string);
      
      $chars = ereg_replace( "(([@]))",  "a", $string); 
      
      $chars = ereg_replace( "(([ ]))",  "_", $string); 
      
      echo "OLA: " . $chars . "<br>";
      
      return $chars;
    }
    
    // Métodos para o Importador de Excel
    public function GetInt4d($data, $pos) {
      $value = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24);
      
      if($value >= 4294967294) {
        $value = -2;
      }
      
      return $value;
    }
    
    // http://uk.php.net/manual/en/function.getdate.php
    public function gmgetdate($ts = null){
      $k = array('seconds', 'minutes', 'hours', 'mday', 'wday', 'mon', 'year', 'yday', 'weekday', 'month', 0);
      
      return(array_comb($k, split(":", gmdate('s:i:G:j:w:n:Y:z:l:F:U', is_null($ts) ? time() : $ts))));
      
    } 
  
    // Added for PHP4 compatibility
    public function array_comb($array1, $array2) {
      $out = array();
      
      foreach ($array1 as $key => $value) {
        $out[$value] = $array2[$key];
      }
      
      return $out;
    }
    
    public function v($data,$pos) {
      return ord($data[$pos]) | ord($data[$pos+1])<<8;
    }
    
    public static function arrayToObject($array){
    	if($array){
    		$object = (object)$array;
    		
    		return $object;
    	}
    	else{
    		return false;
    	}
    }
    
    public function encript($str){
      if($str){
        $hex = "";
        
        $i = 0;
        
        $string = $str . "_" . $this->cript;
        
        do{
          // dechex — Decimal para hexadecimal.
          // ord — Retorna o valor ASCII do caractere.
          
          $hex .= dechex(ord($string[$i]));

          $i++;
        }
        while($i < strlen($string));
        
        return $hex;
      }
    }
    
    public function decript($str){
      if($str){
        $bin = "";
        
        $i = 0;
        
        do{
          $bin .= chr(hexdec($str{$i} . $str{($i + 1)}));
          
          $i += 2;
        }
        while($i < strlen($str));
        
        $dec = substr($bin, 0, strpos($bin, "_" . $this->cript));
        
        return $dec;
      }
    }
    
    public static function getIp(){
      $variables = array('REMOTE_ADDR');
      
      $return = 'Unknown';
      
      foreach($variables as $variable){
        if(isset($_SERVER[$variable])){
          $return = $_SERVER[$variable];
          
          break;
        }
      }
      
      return $return;
    }
    
    public static function weekDayAbbrevToFull($abbrev){
      switch($abbrev){
      	case 'Sun':
      	case 'SUN':
        case 'sun':   
        	$full = "Domingo"; 
        break;
        
        case 'Mon':
        case 'MON':
        case 'mon':   
        	$full = "Segunda-feira"; 
        break;
        
        case 'Tue':
        case 'TUE':
        case 'tue':   
        	$full = "Terça-feira"; 
        break;
        
        case 'Wed':
        case 'WED':
        case 'wed':   
        	$full = "Quarta-feira"; 
        break;
        
        case 'Thu':
        case 'THU':
        case 'thu':   
          $full = "Quinta-feira"; 
        break;
        
        case 'Fri':
        case 'FRI':
        case 'fri':   
        	$full = "Sexta-feira"; 
        break;
        
        case 'Sat':
        case 'SAT':
        case 'sat':   
        	$full = "Sábado"; 
        break;
        
        default:
        	$full = "";
      }
      
      return $full;
    }
    
    public static function monthAbbrevToFull($abbrev){
    	switch($abbrev){
    		case 'Jan':
    		case 'JAN':
    		case 'jan':   
    			$full = "Janeiro"; 
    		break;
    		
    		case 'Feb':
    		case 'FEB':
    		case 'feb':   
    			$full = "Fevereiro"; 
    		break;
                  
        case 'Mar':
        case 'MAR':
        case 'mar':   
        	$full = "March"; 
        break;
        
        case 'Apr':
        case 'APR':
        case 'apr':   
        	$full = "April"; 
        break;
        
        case 'May':
        case 'MAY':
        case 'may':   
        	$full = "Maio"; 
        break;
        
        case 'Jun':
        case 'JUN':
        case 'jun':   
        	$full = "Junho"; 
        break;
        
        case 'Jul':
        case 'JUL':
        case 'jul':   
        	$full = "Julho"; 
        break;
        
        case 'Aug':
        case 'AUG':
        case 'aug':   
        	$full = "Agosto"; 
        break;
        
        case 'Sep':
        case 'SEP':
        case 'sep':   
        	$full = "Setembro"; 
        break;
        
        case 'Oct':
        case 'OCT':
        case 'oct':   
        	$full = "Outubro"; 
        break;
        
        case 'Nov':
        case 'NOV':
        case 'nov':   
        	$full = "Novembro"; 
        break;
        
        case 'Dec':
        case 'DEC':
        case 'dec':   
        	$full = "Dezembro"; 
        break;
    	} 
    	return $full;
    }
  }